/* new */
//构造器中有return值，只要不是return 对象类型的值（object，arry，null除外）就不会改变new 出来的实例

/*
1、创建一个空对象 obj 传入要实例化的工厂Fn
2、将该对象 obj 的原型链 __proto__ 指向Fn的原型 prototype，
并且在原型链 __proto__ 上设置 构造函数 constructor 为要实例化的 Fn
3、传入参数，并让 Fn 改变指向到 obj，并执行
4、最后返回 obj
*/

objectFactory = function (Fn, ...args) {
  let obj = {};
  //实例化对象的__proto__继承Fn的原型
  obj.__proto__ = Fn.prototype;
  //实例化对象的constructor指向构造函数
  obj.__proto__.constructor = Fn;
  //传参给Fn执行，将里面的this指向obj,获取到返回值Fn的返回值，
  //如果Fn有返回值且是object类型的（除了null），则最后返回Fn的返回值
  //反之就返回 obj
  const res = Fn.call(obj, ...args);
  console.log(res);
  return typeof res == "object" ? res : obj;
};
function Father() {
  this.name = "hy";
  this.age = 18;
}
const a = objectFactory(Father);
const b = new Father();

console.log(a);
console.log(b);
